﻿/**
*    @file:    httpservice.cpp
*    @brief:
*    @author:  sanshi522@163.com
*    @date:    2024-12-23  16:27
*/
#include "requestmapper.h"
#include "authorizationguard.h"
#include "responesutils.h"
#include <QDateTime>

RequestMapper::RequestMapper(QObject *parent)
    : HttpRequestHandler(parent)
{
    qDebug() << __FUNCTION__;
    authorizeGuard = false;
}

RequestMapper::~RequestMapper()
{
    qDeleteAll(m_requestMap);
    m_requestMap.clear();
    qDebug() << __FUNCTION__;
}

void RequestMapper::service(HttpRequest &request, HttpResponse &response)
{
    // 允许所有来源（域名）访问该资源，实现跨域资源共享（CORS）
    response.setHeader("Access-Control-Allow-Origin", "*");
    // 允许跨域请求携带凭据（如 cookies、HTTP 认证等）
    response.setHeader("Access-Control-Allow-Credentials", "true");
    // P3P 是一种隐私策略头，用于声明网站的隐私政策，某些浏览器（如 IE）曾用此来处理第三方 Cookie
    response.setHeader("P3P", "CP=CAO PSA OUR");
    // 如果请求中包含 Access-Control-Request-Method（说明是预检请求 preflight）且方法为 OPTIONS，
    // 则返回对应的 CORS 相关响应头
    if (!request.getHeader("Access-Control-Request-Method").isNull() && request.getMethod() == "OPTIONS")
    {
        // 允许的 HTTP 方法（客户端可以使用的请求方式）
        response.setHeader("Access-Control-Allow-Methods", "POST,GET,TRACE,OPTIONS");
        // 允许的请求头字段，客户端可以在请求中使用这些头部字段
        response.setHeader("Access-Control-Allow-Headers", "Content-Type,Origin,Accept");
        // 预检请求缓存时间（单位：秒），告诉浏览器在该时间内不需要重复发送 OPTIONS 请求
        response.setHeader("Access-Control-Max-Age", 86400);
    }
    // 设置响应内容类型为 JSON 格式，并指定字符编码为 UTF-8
    response.setHeader("Content-Type", "application/json;charset=utf-8");
    // 设置响应头中的 Date 字段，表示响应生成的时间
    response.setHeader("Date", QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss").toUtf8());
    QString path = request.getPath();
    QStringList pathList = path.split("/");
    // 因为path以 / 为开头，使用split，第一个元素为空串
    if (pathList.size() < 3)
    {
        return this->returnError(response);
    }

    if (pathList.value(1) != "api")
    {
        return this->returnError(response);
    }

    qDebug() << __FUNCTION__ << pathList;

    if (authorizeGuard && !AuthorizationGuard::getInstance().isAuthorised())
    {
        return ResponesUtils::erroResponse(response, "服务端未授权！请联系 17633603876 ");
    }

    if (m_requestMap.find(pathList.value(2)) != m_requestMap.end())
    {
        return m_requestMap.value(pathList.value(2))->service(request, response);
    }
    else
    {
        return this->returnError(response);
    }
}

void RequestMapper::installController(QString path, HttpRequestHandler *httpRequestHandler)
{
    m_requestMap.insert(path, httpRequestHandler);
}

bool RequestMapper::getAuthorizeGuard() const
{
    return authorizeGuard;
}

void RequestMapper::setAuthorizeGuard(bool value)
{
    authorizeGuard = value;
}
